# -*- coding: utf-8 -*-
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from django.views import View
from cart.cartmanager import *


# Create your views here.
class OrderView(View):
    def get(self,request):

        import jsonpickle
        # 判断当前用户是否登录
        if not request.session.get('user'):
            # 未登录则带着这一堆参数跳转到登录页面
            return HttpResponseRedirect('/user/login/?redirect=order&cartitems=' + request.GET.get('cartitems'))
        else:

            # 将购物项反序列化成[{k:v}{k:v}]形式列表对象

            # [{'goodsid':'','sizeid':'','colorid':''},{},{}]
            # 如果已登录,会将传回来的json参数反序列化赋值给一个变量
            raw_cartitems = jsonpickle.loads('[' + request.GET.get('cartitems') + ']')

            # 因为目前还没有创建订单
            # 所以将购物项存放至session对象中

            request.session['raw_cartitems'] = raw_cartitems
            return HttpResponseRedirect('/order/order.html')

from cart.cartmanager import *

class OrderListView(View):
    def get(self,request):

        #获取当前用户下的购物项,调用的是CartManger里的一个工厂方法,返回的是一个CartManger对象
        cart_manager = getCartManger(request)
        # 通过该对象获取当前用户下的已购物的商品
        cartitems = [cart_manager.get_cartitems(**item) for item in request.session.get('raw_cartitems',[])]


        #获取当前用户下的默认收货地址
        address = User.objects.get(account=request.session.get('user')).address_set.get(isdefault=True)


        #计算结算总金额
        totalprice = 0
        for cartitem in cartitems:
            # 通过调用cart下的模型里的获取价格方法来计算总金额
            totalprice+=cartitem.total_price()

        return render(request,'order.html',{'cartitems':cartitems,'address':address,'totalprice':totalprice})


#Order  订单做的事情
# 将购物项转换成订单项(待支付)
# 将购物项从购物车删除
# 修改库存
# 根据支付方式跳转到支付界面
# 支付成功
# 验签
# 修改订单状态--->待发货
from User.models import *
from django.db.transaction import atomic
from .models import *
from goods.models import *
from utils.alipay import AliPay

# 创建Alipay对象初始化参数(包含:阿里的沙箱appid,接收阿里传回的通知信息的链接,商户自己的私钥,阿里的公钥,将项目的debug属性传送到对象里面去)
alipay = AliPay(appid='2016100900647057', app_notify_url='http://127.0.0.1:8000/order/checkorder',app_private_key_path='my_private_key.txt',
alipay_public_key_path='alipay_public_key.txt', return_url='http://127.0.0.1:8000/order/checkorder', debug=True)

#获取支付宝付款页面
class ToOrderView(View):
    # @atomic 原子, 加了这个的函数在对数据库进行操作的时候如果有一个失败了, 那么之前做过的操作也都会回滚

    @atomic
    def get(self, request):
        import json, uuid, datetime
        # 先获取从前台传过来的参数,并反序列化
        cartitems = json.loads(request.GET.get('cartitems'))


        raw_order = {
            'address': Address.objects.get(id=request.GET.get('address')), #获取地址
            'payway': request.GET.get('payway', 'alipay'), #获取支付方式
            'out_trade_num': uuid.uuid4().hex, #订单编号
            'order_num': datetime.datetime.today().strftime('%Y%m%d%H%M%S'),  #给用户看的订单编号
            'user': User.objects.get(account=request.session.get('user')), #获取下单用户
        }
        # 将本次订单写入到数据库里
        order = Order.objects.create(**raw_order)
        total_amount = 0
        for item in cartitems:

            #创建订单项
            orderitem = OrderItem.objects.create(order=order, **item)
            #计算总金额
            total_amount += orderitem.total_price()
            #删除购物车中的购物项
            CartItem.objects.filter(**item).delete()
            #修改商品库存
            Inventory.objects.filter(goods_id=item['goodsid'], color_id=item['colorid'], size_id=item['sizeid']).update(
                count=F('count') - int(item['count']))
            #删除session中的结算购物项
            if 'raw_cartitems' in request.session:
                del request.session['raw_cartitems']


        params = alipay.direct_pay(subject='九块九电商支付', total_amount=str(total_amount),
                                   out_trade_no=order.out_trade_num)

        from MyShop.settings import DEBUG
        if DEBUG is True:
            # 沙箱网关
            url = 'https://openapi.alipaydev.com/gateway.do?' + params
        else:
            # 正式网关
            url = 'https://openapi.alipay.com/gateway.do?' + params

        return HttpResponseRedirect(url)


# 验证是否支付成功
class CheckOrderView(View):
    def get(self, request):

        # 获取所有请求参数
        d = request.GET.dict()

        # 从请求参数中移除sign
        sign = d.pop('sign')
        # 验证签名
        if alipay.verify(d, sign):
            out_trade_no = d.get('out_trade_no')
            # 根据订单支付编号获取当前订单
            order = Order.objects.get(out_trade_num=out_trade_no)
            # 修改订单状态
            if order.status == '待付款':
                order.status = '待发货'
                order.trade_no = d.get('trade_no')
                order.save()

            return HttpResponse('付款成功！')
        else:
            return HttpResponse('付款失败！')